package com.peanut.boot;

import com.peanut.boot.entiity.User;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * @className: com.peanut.boot-> MainApplication
 * @description: boot项目启动类
 * @author: chenhs
 * @createDate: 2021-09-20 18:45
 * @version: 1.0
 */
/**
 * 标识这个是boot的主程序类，启动的入口,默认 注解扫描主程序同包及其子包下面的所有注解，
 * 但是 通过 scanBasePackages属性可以重新指定注解扫描范围。
 *
 */



/**
 * @title
 * @description 主程序
 * @author cehnhs
 * @updateTime 2021/9/20 22:06
 */

/**
 * @ServletComponentScan
 * 指定原生servlet包的注解扫描范围，默认启动类的同路径下的所有文件。
 * 在SpringBootApplication上使用@ServletComponentScan注解后，
 * Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener
 * 注解自动注册，无需其他代码。
 * @MapperScan
 * mybatis pulis 扫描mapper接口
 */
@ServletComponentScan(basePackages = "com.peanut.boot.servlet")
@SpringBootApplication(scanBasePackages = "com.*")
@MapperScan("com.peanut.boot.mapper.*")
public class MainApplication {
    public static void main(String[] args) {
//       1 返回ioc容器ComponentScan
        ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);
//      2  遍历容器中的组件，容器中的组件都是单例的
        String[] definitionNames = context.getBeanDefinitionNames();
//        for (String name : definitionNames) {
//            System.out.println(name);
//        }
//     3 从容器中获得组件  组件对象都是单例的
        User user = context.getBean("user_01", User.class);
        System.out.println(user.toString());
    }
}
